package cn.wolfcode.interceptor;


import cn.wolfcode.domain.Employee;
import cn.wolfcode.qo.UserContext;
import cn.wolfcode.util.RequiredPermission;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.invoke.MethodHandle;
import java.util.List;
@Component
public class PermissionInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //先通过HttpServletRequest的对象获取session 拿到员工对象
        Employee employee = UserContext.getEmployee();
        //判断员工对象是否是超级管理员 如果是的话就放行
        if(employee.isAdmin()){
            return true;
        }

        //如果访问的是静态资源或者其他资源也是会进来的就会导致异常
        //所以当不是HandlerMethod的时候我们就放行
        if(!(handler instanceof HandlerMethod)){
            return true;
        }

        //如果不是 就要通过handler去获取控制器里面他访问的是什么方法
        //因为控制器启动的时候 就把@RequerMaping的方法存到Map中
        //通过用户当前访问的路径来去map里面找对应的值 就是贴了@RequerMaping的方法
        //需要强转 否则无法使用它特有方法 HandlerMethod
        HandlerMethod handlerMethod = (HandlerMethod) handler;

        //然后在判断这个方法上有没有贴自定义注解
        RequiredPermission permission = handlerMethod.getMethodAnnotation(RequiredPermission.class);
        //如果没贴就放行
        if(permission == null){
            return true;
        }
        //如果有贴就 获取注解里面的表达式
        String expression = permission.expression();
        //和sql查询的集合匹配
        List<String> permissions = UserContext.getPermissions();
        //如果包含就有权限就放行
        if(permissions.contains(expression)){
            return true;
        }
        //如果没有
               //因为转发 不会经过 视图解析器 所以没有样式
        //所以我们使用重定向到控制器 在跳转到 权
        response.sendRedirect("/nop");

        return false;
    }
}
